#ifndef DockComponentsFactoryH
#define DockComponentsFactoryH
//============================================================================
/// \file   DockComponentsFactory.h
/// \author Uwe Kindler
/// \date   10.02.2020
/// \brief  Declaration of DockComponentsFactory
//============================================================================

//============================================================================
//                                   INCLUDES
//============================================================================
#include "ads_globals.h"

namespace ads
{
    class CDockWidgetTab;
    class CDockAreaTitleBar;
    class CDockAreaTabBar;
    class CDockAreaWidget;
    class CDockWidget;
    class CAutoHideTab;

    /**
     * 用于创建停靠框架的特定GUI元素的工厂。
     * CDockComponentsFactory提供了默认的唯一实例来创建所有支持的组件。
     * 若要注入自定义组件，可以创建自己派生的dock组件工厂，并通过setDefaultFactory()函数进行注册。
     *
     * 示例：
     * CDockComponentsFactory::setDefaultFactory(new MyComponentsFactory()));
     */
    class ADS_EXPORT CDockComponentsFactory
    {
    public:
        /**
         * 强制虚析构函数
         */
        virtual ~CDockComponentsFactory() {}

        /**
         * 默认实现只是创建一个带有CDockWidgetTab(DockWidget)的停靠窗口选项卡。
         */
        virtual CDockWidgetTab* createDockWidgetTab(CDockWidget* DockWidget) const;

        /**
         * 默认实现只是创建一个带有CDockWidgetTab(DockWidget)的停靠窗口侧边选项卡。
         */
        virtual CAutoHideTab* createDockWidgetSideTab(CDockWidget* DockWidget) const;

        /**
         * 默认实现只是创建一个带有CDockAreaTabBar(DockArea)的停靠区选项卡栏。
         */
        virtual CDockAreaTabBar* createDockAreaTabBar(CDockAreaWidget* DockArea) const;

        /**
         * 默认实现只是创建一个带有CDockAreaTitleBar(DockArea)的停靠区标题栏。
         */
        virtual CDockAreaTitleBar* createDockAreaTitleBar(CDockAreaWidget* DockArea) const;

        /**
         * 返回默认的组件工厂
         */
        static const CDockComponentsFactory* factory();

        /**
         * 设置新的默认工厂来创建GUI元素。
         * 此函数将拥有给定的工厂。
         */
        static void setFactory(CDockComponentsFactory* Factory);

        /**
         * 将当前工厂重置为默认工厂
         */
        static void resetDefaultFactory();
    };

    /**
     * 便捷函数以简化工厂实例的访问
     */
    inline const CDockComponentsFactory* componentsFactory()
    {
        return CDockComponentsFactory::factory();
    }
} // namespace ads

//---------------------------------------------------------------------------
#endif // DockComponentsFactoryH
